package rodrigosetti.game2d.grafico;

import rodrigosetti.game2d.geom.Vetor2D;

/**
 * Informacoes sobre o contexto grafico o qual esta inserido um desenho
 * 
 * @author Rodrigo
 */
public class ContextoGrafico {

	/**
	 * Fator de zoom aplicado ao grafico, 1.0 significa nenhum zoom,
	 * maior que 1 significa mais zoom e menor que 1 significa menos zoom.
	 */
	private double zoom = 1.0f;

	/**
	 * Deslocamento da "camera" em relacao a origem
	 */
	public Vetor2D offset;

	/**
	 * Tamanho horizontal da saida grafica(clip)
	 */
	private int width;

	/**
	 * Tamanho vertical da saida grafica(clip)
	 */
	private int height;

	/**
	 * Constroi um contexto grafico com o tamanho especificado
	 * 
	 * @param width Tamanho horizontal da saida grafica
	 * @param height Tamanho vertical da saida grafica
	 */
	public ContextoGrafico(int width, int height) {
		this.setWidth(width);
		this.setHeight(height);
		offset = new Vetor2D(width / 2, height / 2);
	}

	/**
	 * Constroi um contexto grafico com tamanho e offset definidos
	 * 
	 * @param width Tamanho horizontal da saida grafica
	 * @param height Tamanho vertical da saida grafica
	 * @param offset Deslocamento em relacao a origem
	 */
	public ContextoGrafico(int width, int height, Vetor2D offset) {
		this(width, height);
		this.offset = offset;
	}

	/**
	 * Constroi contexto grafico com tamanho, offset e zoom.
	 * 
	 * @param width Tamanho horizontal da saida grafica
	 * @param height Tamanho vertical da saida grafica
	 * @param offset Deslocamento em relacao a origem
	 * @param zoom Fator de zoom aplicado
	 */
	public ContextoGrafico(int width, int height, Vetor2D offset, double zoom) {
		this(width, height, offset);
		this.setZoom(zoom);
	}

	/**
	 * Transforma coordenada real para coordenada pixel neste contexto grafico.
	 * 
	 * @param real Coordenada real
	 * @return Coordenada em pixels
	 */
	public Vetor2D realToPixel(Vetor2D real) {
		return new Vetor2D(((real.x - offset.x) * getZoom()) + (getWidth() / 2.0f),
				((real.y - offset.y) * getZoom()) + (getHeight() / 2.0f));
	}

	/**
	 * Transforma coordenada em pixels para coordenada real neste contexto
	 * grafico
	 * 
	 * @param pixel Coordenada em pixels
	 * @return Coordenada real
	 */
	public Vetor2D pixelToReal(Vetor2D pixel) {
		return new Vetor2D(((pixel.x - (getWidth() / 2.0f)) / getZoom())
				+ offset.x, ((pixel.y - (getHeight() / 2.0f)) / getZoom()) + offset.y);
	}

	public double getZoom()
	{
		return zoom;
	}

	public void setZoom(double zoom)
	{
		this.zoom = zoom;
	}

	public int getWidth()
	{
		return width;
	}

	public void setWidth(int width)
	{
		this.width = width;
	}

	public int getHeight()
	{
		return height;
	}

	public void setHeight(int height)
	{
		this.height = height;
	}

}
